Series Authentication: Phần 2: Token-based Authentication – "Vé Vào Cửa" Cho Ứng Dụng Hiện Đại
1. Token-based Authentication Là Gì?
Token-based Authentication có thể hiểu đơn giản như việc nhận "vé vào cổng" sau khi đăng nhập thành công, và sau đó bạn chỉ cần chìa vé này ra mỗi khi muốn vào lại. Thay vì phải liên tục gửi username và password, hệ thống sẽ cấp cho bạn một token duy nhất (giống như vé) sau khi xác thực thành công. Token này sẽ được sử dụng để xác thực các yêu cầu tiếp theo.
2. Cách Hoạt Động
Quá trình xác thực bằng token diễn ra theo các bước sau:
- Người dùng nhập thông tin đăng nhập (username và password).
- Server kiểm tra và xác thực thông tin: Nếu hợp lệ, server sẽ tạo ra một token, thường là JWT (JSON Web Token).
- Token được trả về cho người dùng: Token này sẽ được lưu trữ ở phía client (trong local storage hoặc cookie).
- Client sử dụng token này cho các yêu cầu tiếp theo: Token sẽ được gửi kèm trong các request để xác minh người dùng mà không cần phải nhập lại username và password.
Ví dụ vui: Hãy tưởng tượng bạn vào rạp xem phim. Sau khi mua vé (đăng nhập thành công), bạn có thể thoải mái ra vào rạp bất kỳ lúc nào miễn là còn giữ vé (token). Nếu làm mất vé, bạn sẽ phải mua lại từ đầu (đăng nhập lại).
3. Ưu Điểm Của Token-based Authentication
Token-based Authentication ngày càng phổ biến nhờ nhiều ưu điểm nổi bật:
- Không cần lưu trữ phiên (stateless): Không giống như cookie-based authentication, token không cần lưu trữ thông tin phiên trên server. Điều này làm cho hệ thống dễ dàng mở rộng hơn.
- Dễ sử dụng cho các ứng dụng mobile và single-page app: Token có thể được lưu trữ ở bất kỳ đâu trên client, không chỉ giới hạn trong trình duyệt.
- Tính bảo mật cao: Token có thể được mã hóa, ký số (ví dụ như JWT), và có thời hạn sử dụng. Nếu bị mất token, nó sẽ hết hạn sau một khoảng thời gian nhất định, giảm nguy cơ bị kẻ xấu lợi dụng.
4. Hạn Chế Của Token-based Authentication
Tuy nhiên, không có giải pháp nào là hoàn hảo và Token-based Authentication cũng có những hạn chế riêng:
- Token bị đánh cắp có thể gây nguy hiểm: Nếu token không được bảo vệ đúng cách (lưu trữ không an toàn), kẻ xấu có thể lấy cắp và sử dụng để truy cập vào hệ thống.
- Cần quản lý thời gian hết hạn: Nếu token hết hạn trong khi người dùng đang sử dụng hệ thống, họ có thể phải đăng nhập lại, gây phiền phức.
- Không an toàn nếu không sử dụng HTTPS: Giống như các phương pháp khác, token-based auth không an toàn nếu sử dụng trên HTTP.
5. JSON Web Token (JWT)
Khi nói đến Token-based Authentication, JWT là loại token phổ biến nhất. JWT có cấu trúc gồm ba phần: header, payload, và signature, tất cả được nối với nhau bằng dấu chấm (.
). Một JWT có dạng như sau:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvbiBEb2UiLCJpYXQiOjE1MTYyMzkwMjJ9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
- Header: Chứa thông tin về loại token và thuật toán mã hóa.
- Payload: Chứa dữ liệu mà bạn muốn lưu trữ, như thông tin người dùng.
- Signature: Được tạo ra bằng cách mã hóa header và payload với một khóa bí mật.
Ví dụ minh họa: JWT giống như một chiếc bánh sandwich (3 lớp). Lớp trên là "header", lớp giữa là "payload" chứa nhân thịt (dữ liệu), và lớp cuối cùng là "signature" giữ cho tất cả không bị rơi ra ngoài.
6. Triển Khai Token-based Authentication
Cùng xem qua một ví dụ về cách triển khai Token-based Authentication sử dụng JWT trong Node.js:
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
app.use(express.json());
const SECRET_KEY = 'supersecretkey';
// API đăng nhập
app.post('/login', (req, res) => {
const { username, password } = req.body;
// Giả sử người dùng nhập đúng thông tin
if (username === 'admin' && password === 'password123') {
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).json({ message: 'Sai thông tin đăng nhập' });
}
});
// API yêu cầu bảo mật
app.get('/protected', (req, res) => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) return res.sendStatus(401);
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) return res.sendStatus(403);
res.json({ message: 'Chào mừng, bạn đã truy cập vào vùng bảo mật!' });
});
});
app.listen(3000, () => {
console.log('Server đang chạy trên cổng 3000');
});
Trong ví dụ này, khi người dùng đăng nhập thành công, họ sẽ nhận được một JWT và có thể sử dụng token này để truy cập vào các API bảo mật.
7. Khi Nào Nên Sử Dụng Token-based Authentication?
- Khi bạn phát triển ứng dụng SPA (Single Page Application) hoặc mobile app.
- Khi bạn muốn hệ thống dễ dàng mở rộng (stateless).
- Khi bạn cần một giải pháp xác thực đơn giản nhưng vẫn bảo mật.
8. Kết Luận
Token-based Authentication là một giải pháp hiện đại và tiện lợi cho nhiều loại ứng dụng. Nó giúp cho việc xác thực người dùng trở nên dễ dàng hơn, đặc biệt là trong các ứng dụng có yêu cầu mở rộng lớn. Tuy nhiên, để đảm bảo an toàn, bạn cần phải biết cách bảo vệ token và luôn sử dụng HTTPS.
Token giống như một chiếc vé vào cổng - dễ dàng sử dụng, nhưng nếu làm mất, bạn có thể gặp rắc rối lớn. Vì vậy, hãy cẩn thận và bảo vệ nó thật kỹ lưỡng nhé!
Hatonet kết nối doanh nghiệp ITO toàn cầu.
Giúp các doanh nghiệp IT Việt Nam tiết kiệm chi phí,tìm kiếm
đối tác,mở rộng mạng lưới.
- Mở rộng kênh tìm kiếm khách hàng gia tăng doanh thu.
- Tiết kiệm chi phí quan hệ tìm đối tác.
- Ứng tuyển trực tuyến bất cứ lúc nào khi có yêu cầu.
- Trực tiếp liên kết với công ty quốc tế
Liên hệ :
Email: hello@hatonet.vn
Zalo: https://zalo.me/hatonet